プ ログラミングやRPG(作るほう)が好きな人の日記
個人的な趣味(プログラミング、イラスト、電子回路)のページです。 自身のパソコンのやりすぎに対する管理の表の公開、 最近見ているアニメや映画と 買い物の簡易なリスト、 それから日記を掲載しています。日記が主体です。 |
この表は、このウェブページの管理人のパソコンの使用時間を管理・制限するためのものです。
このようなプライベートなことを公開して、ちょっと恥ずかしいようなところもありますが、これでうまくいっているので良しとしています。
No. | A1. 開始時 運動 |
A2. 勉 強 1問 |
A3. 終了時 運動 |
H1. 予定 作業内容 |
H2. 予定 作業詳細(進捗%) 判定×の理由 |
B.
実際 開始時刻 |
C. 予定 使用時間 (当日限度) |
D. 予定 終了時刻 |
E.
実際 終了時刻 |
F.
実際 使用時間 |
G1.
判定 ◎ 9分以下
○ 10分~19分 △ 20分~29分 × 30分以上 |
||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
500 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 16:55 | 1:05(お試し中unlock) | 18:00 | |||||||
区 切りの際に15分以上 別のこと: 昼食 | |||||||||||||
499 | × | × | Bluetoothヘッドホン 音声無しで30分くらい経つとプツプツになるのを対処 |
Bluetoothリセットのスクリプトで対処しようとした。 時間がかかってきつかったが、うまくいった。 |
13:25 | 1:30(お試し中unlock) | 14:55 | 15:17 | 1:52 | (お試し中 2h越えたら×)◎ | |||
498 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 17:20 | 1:30(お試し中unlock) | 18:50 | 23:00 | 5:10 | (お試し中 2h越えたら×)× | ||||
区 切りの際に15分以上 別のこと: 間食、アニメ | |||||||||||||
497 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 12:55 | 1:30(お試し中unlock) | 14:25 | 16:10 | 1:45 | (お試し中 2h越えたら×)◎ | ||||
496 | × | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 21:15 | 1:45(お試し中unlock) | 23:00 | 23:00 | 1:45 | (お試し中 2h越えたら×)◎ | |||
区 切りの際に15分以上 別のこと: 夕飯など | |||||||||||||
495 | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 19:00 | 1:30(お試し中unlock) | 20:30 | 20:29 | 1:29 | (お試し中 2h越えたら×)◎ | |||||
494 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 22:25 | 0:35(お試し中unlock) | 23:00 | 23:00 | 0:35 | (お試し中 2h越えたら×)◎ | ||||
493 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 20:30から始めて23:00までの間に一度休むのは半端だと思った |
20:35 | 1:30(お試し中unlock) | 22:05 | 23:00 |
2:25 |
(お試し中 2h越えたら×)× | ||||
492 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 20:25 | 1:30(お試し中unlock) | 21:55 | 21:55 |
1:30 |
(お試し中 2h越えたら×)◎ | ||||
区 切りの際に15分以上 別のこと: 皿洗い、夕飯の支度 | |||||||||||||
491 | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 バグ取りに手間取った |
16:30 | 1:30(お試し中unlock) | 18:00 | 19:22 | 2:52 | (お試し中 2h越えたら×)× | |||||
区 切りの際に15分以上 別のこと: いつも清掃しない場所の清掃 | |||||||||||||
490 | ページ上のプログラムリスト表示機能の復帰(再度 作成) | 挿絵について修正 | 13:45 | 1:30(お試し中unlock) | 15:15 | 15:19 | 1:34 | (お試し中 2h越えたら×)◎ | |||||
489 | × | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | いくつか修正 | 21:30 | 1:30(お試し中unlock) | 23:00 | 23:00 | 1:30 | (お試し中 2h越えたら×)◎ | |||
488 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | いくつか修正 |
21:30 |
1:30(お試し中unlock) |
23:00 | 23:00 | 1:30 |
(お試し中 2h越えたら×)◎ | ||||
487 | × | × | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | バグ修正 | 21:45 | 1:15(お試し中unlock) | 23:00 | |||||
486 | × | Web ページ記事作成 | プログラムリスト表示機能について | 20:20 | 1:30(お試し中unlock) | 21:50 | 23:00 |
2:40 |
(お試し中 2h越えたら×)× | ||||
区切りの際に15分以上 別のこと: 夕飯作り | |||||||||||||
485 | ページ上のプログラムリスト表示機能の復帰(再度 作成) | diffコマンド実装 (2つのファイルの比較) |
16:45 | 1:30(お試し中unlock) | 18:15 | 18:45 | 2:00 | (お試し中 2h越えたら×)◎ | |||||
区切りの際に15分以上 別のこと: 間食 | |||||||||||||
484 | ページ上のプログラムリスト表示機能の復帰(再度 作成) | diffコマンド実装 (2つのファイルの比較) |
13:40 | 1:30(お試し中unlock) | 15:20 | 15:39 | 1:49 | (お試し中 2h越えたら×)◎ | |||||
483 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | diffコマンド実装 (2つのファイルの比較) |
21:10 | 1:50(お試し中unlock) | 23:00 | |||||||
482 | × | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | diffコマンド実装 (2つのファイルの比較) |
22:00 | 1:00(お試し中unlock) | 23:00 | 23:00 | 1:00 | (お試し中 2h越えたら×)◎ | |||
481 | ー | ー | PC-9801 アセンブラ学習 Cコンパイラ用意 |
open watcom の試用 |
20:30 |
1:30(お試し中unlock) | 22:00 |
22:16 |
1:46 |
(お試し中 2h越えたら×)◎ |
|||
480 | ー | ー | PC-9801 アセンブラ学習 本「98マシン語」 |
2章 マシン語の基礎知識 3. モニタの使い方 実機DISK作成に手間取った |
19:45 | 1:30(お試し中unlock) | 21:15 | 21:50 | 2:05 | (お試し中 2h越えたら×)× | |||
区切りの際に15分以上 別のこと: 台所の皿洗い、買い物 | |||||||||||||
479 | ー | ー | PC-9801 アセンブラ学習 本「98マシン語」 |
2章 マシン語の基礎知識 3. モニタの使い方 |
15:30 | 1:30(お試し中unlock) | 17:00 | 17:10 |
1:40 |
(お試し中 2h越えたら×)◎ | |||
478 | ー | ー | PC-9801 アセンブラ学習 本「98マシン語」 |
2章
マシン語の基礎知識 3. モニタの使い方 |
22:25 | 0:35(お試し中unlock) | 23:00 | 23:00 |
0:35 |
(お試し中 2h越えたら×)◎ | |||
区 切りの際に15分以上 別のこと: 自販機へ買い物、台所の皿洗い、間食 | |||||||||||||
477 | ー | ー | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ 長かったですが完成 |
20:00 | 1:30(お試し中unlock) | 21:30 | 21:36 | 1:36 | (お試し中 2h越えたら×)◎ | |||
476 |
|
|
ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ うまくいかなかった でもひと段落。良かった |
15:20 | 1:30(お試し中unlock) | 16:50 | 18:37 | 3:17 | (お試し中 2h越えたら×)× | |||
区 切りの際に15分以上 別のこと: 台所の皿洗い、トイレ掃除 | |||||||||||||
475 | ー | ー | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ | 13:00 | 1:30(お試し中unlock) | 14:30 | 14:37 |
1:37 |
(お試し中 2h越えたら×)◎ | |||
474 | ー | ー | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ | 21:00 | 2:00(お試し中unlock) | 23:00 | 23:00 |
2:00 |
(お試し中 2h越えたら×)◎ | |||
区切りの際に15分以上 別のこと: 台所の皿洗い | |||||||||||||
473 | ー | × | ー | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ | 18:45 | 1:30(お試し中unlock) | 20:15 | 20:15 | 1:00 | (お試し中 2h越えたら×)◎ | ||
472 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ | 21:45 | 1:15(1:30) | 23:00 | |||||||
471 | × | ページ上のプログラムリスト表示機能の復帰(再度 作成) | しあげ | 22:00 | 1:00(1:30) | 23:00 | 23:00 | 1:00 | ◎ | ||||
470 | × |
PC-9801
アセンブラ学習 本「PC-9801スーパーテクニック」 |
読み進めと、 ホームページ更新 自己啓発だから、と考えた |
14:00 |
unlock | unlock | 23:00 |
9:00 |
× |
この表の意図:
多くの人はパソコンのやりすぎやネットゲームのやりすぎには困っていると 思います。
参考に言うと、この表を使う前の私は 1 回の PC 使用時間がノンストップで 17 時間というときもあったし、平均で言うと毎日 9 時間はやっていたと思います。
この表を使ってパソコンの使用時間を 事前に決めて、ネッ ト上に公開 することで、パソコンのやりすぎを防止できたら、と思います。
また、数年前から考えてきましたが、そういう徹夜とか長時間作業をするよ りも、昼間の短時間作業のほうが生産性は高いのではないかと思います。そういう意味でも期待しています。
※以前は NO PC WEEK と称してパソコンを使用しない期間を設けることでやりすぎに対処してきましたが、もっと具合の良い方法はないかと考え、この表を使うようになりました。
臨時お試し(2022年1月8日~)
最近、状況が以下のように少し変化していて…
…これまでのやり方だとうまくいかないところがあるので、お試しでやり方を少し変更します。
お試しで以下のようにします。
これがうまくいかない場合は、以上を取り消しします。
(「1.5h(または2.0h)ごとに区切り、」というのが難しいんじゃないかと思う…)
中途結果
記入の規則:
ちなみに、分単位で記録を取ったりして、だいぶマメに見えるかもしれませんが、Windows の日本語入力(MS-IME)で「いま」と入力し、 変換 キーを押さずに ↑ ボタンを押すと現在の時刻になります。道具の便利さが人をマメに見せるのかもしれません。
例外事項:
「スーパーPC WEEK」:
連休中(3連休以上)に、NO PC WEEK をオフにして好きなだけパソコンを使ってよいとする期間を、「NO PC WEEK」に対して「スーパーPC WEEK」と言う。
ただし以下の決まりを守ること。
なお、表の中央やや右寄りの「C. 予定 使用時間(当日限度)」列の "当日限度" には UNLOCK と記入する。
中途結果:
結構いい結果になっています。 炊事や掃除、散歩、早起きなどが好ましいリズムでできるようになりました。
(2020年9月6日追記:散歩、早起きは最近あまりできていません。掃 除や炊事は理想的にできています)
ま た、パソコン以外の趣味も進むようになりました。電子回路、ガンプラ、RPG のプログラム以外のモンスターイラストやストーリーなど RPG の肉付け部分の創作、勉強、昔好きだったペーパークラフト等々。
そ してパソコンの趣味自体も深夜遅くまで行うよりも質が高くなったように感じます。制限された短い時間の中で結果を得ようとす るので、取捨選択が行われているし、時間が終了して、空いた時間ができ、それがほどよい休憩になり、今後の作業の方針を落ち 着いて検討することもできます。それが質につながっているのかなと思います。
この取り組みが、15 才 ~ 18 才くらいまでの高専(中退)に所属していた時に実施できていたら良かっただろうなと思います。でもそれくらいの年齢では経験が浅く、このような効果的なルール作りを行うこ とはできなかったと思います。自分は人に比べて「創作意欲」や「ゲームで遊ぶ欲望」におぼれやすいところがあり、そのコントロールは とても難しいです。
2021年10月23日追記:
ここで決めた規則通りにできていないこともありますが、それでも確実なメ リットがあるのでここに箇条書きで記します。
他にもメリットはありますがたくさん書いてもしょうがないのでここまで。
また、反面、デメリットもあるので少し書いておきます。
デメリットはそれくらいしか思いつきません。我ながらメリットの多い表な んだと再確認しました。
自分の家族にすすめたい方へ:
パソコンのやりすぎやネットゲームのやりすぎは社会問題にもなっているので、「うちの子についてなんとかしないと…」と思っている ご家族の方は多くいらっしゃると思います。
私の両親も過去に私について問題にしていました。学校へ行かず、毎日朝までパソコンに向かい、 悶々としていたんです。
この表はその家族が困っていたときから 30 年後に、私が自分で必要を感じて作ったものです。
私は今 一人暮らしをしていて、自分で生計を立てる中、パソコンにおぼれた生活をすると、生活がうまく回らなくなるんです。
具体的には、
これらを改善するために表を作りました。
でも、このような必要にせまられて「自分の動機で始めた場合」と、「人からすすめられて始めた場合」とでは、結果が異なると思いま す。
自分の切実な動機で始めたなら自分から進んでこの表を活用すると思いますが、外から押し付けられたものはなかなか定着しないもので す。
あまり適当なことは言えませんが、「中途結果」タブの中の青い部分で 書いたことは、本人にとって得になることなので、「ときどき休憩して、他のあの趣味やってみたらどうだ?」とか「ときどき休憩したほ うがプログラミングの質が上がるって話だぞ?」という形ですすめてみたらどうでしょうか。(それでも最終的には自立してもらうことは 必要だと思いますが)
私が両親を困らせていたときに、突然、外へ一人で出て行って、一人暮らしを始めたり、接客業を始めたり、いくつか資格取得したりと いろいろ行えた理由というのは、正直言ってわかりません。(※しかし途中で失業して2度、実家に戻ったことがあります。1 回目は 21 才くらいのときに 5 年間、2 回目は 35 才くらいのときに1年未満、実家にいて、何もしてなかったり働いたりしていました)
私が両親を困らせていたのは 16 才 ~ 20 才くらいの学生のころですが、そのころ家族と私自身と友人たちがみんなそれぞれ、私の生活について心配したり困ったり悩んだり、あの手この手を試したりしていました。そう いう煮詰まったような状況が運命をそのように(解決の方向へ)動かすのかもしれません。運命がどうの というのは変ですが、そのくらいのことしか言えません。何かしら取り組む必要があるということですかね。
この社会問題はクリアーすべきものみたいです。
日
付 (上ほど新しい) |
タイトル | 無料配信 配信日 |
公評価 | 私 評価 |
---|---|---|---|---|
2021/12/26~視聴中 | ジョジョの奇妙な冒険 スターダストクルセイダース(リンクは Yahoo GYAO
で検索) アクション・アドベンチャー/1989年週刊少年ジャンプ/各話24 分程度 4thシーズン「黄金の風」、3rdシーズン「ダイヤモンドは砕けな
い」とGYAOで十分に楽しんで観てきましたが、2ndシーズン「スターダストクルセイダース」これもまた面白い!
OVA版(1993年)ではなくテレビアニメ版(2014年)。第48話まである。 観てみると、絵柄、演出、どれをとっても、なんともパワフルだと思う。 おすすめです! |
月火・・土日 | ★★★★☆ 5 |
★★★★☆ 4 |
2021/7/15~視聴中 | ドラゴンボール(リンクは Yahoo GYAO で検索) 冒険・格闘技/1984年週刊少年ジャンプ/各話25分程度 |
月・水・金・・ | ★★★★☆ 4.8 |
★★★★☆ 4.5 |
2021/5 /18~視聴中 | はじめの一歩(リンクは Yahoo GYAO で検索) ボクシング/1989年週刊少年マガジン/各話25分程度 大人になってわかる、ドラゴンボールを上回る面白さ。スケベ表現がた
まにあるので男性向け?
10月16日(土) 追記
シリーズが「New
Challenger」という新しいものに変わりました。
1話2話を見る限り、あまり面白くなくなってしまったかも。
でもその後、数話見ていると、以前ほどではないけど結構面白いです。
1月1日(土)追記
はじめの一歩 Rising #12 完全なるデンプシー破り
演出最高!感動で涙が出てきた。
悲しいとか嬉しいとかそういう涙ではなく、感動で身体がしめられてそれで出る涙。 「演出」が何なのか素人なので知らないけど、その時の音楽とか映像とか、その辺で感動させられました。 私に★5を出させるとは…やられたぞ!! |
月・水・・土・ | ★★★★☆ 4.5 (第1シーズン) ★★★☆☆ ↑たしかこれくらい (New Challenger) ★★★☆☆ 3.5 (Rising) |
★★★★★ 5.0 (第1シーズン) ★★★☆☆ 3.0 (New Challenger) ★★★★☆ 4.0 (Rising) |
日
付 (上ほど新しい) |
タイトル | 無料配信 (日付まで) |
公評価 | 私 評価 |
---|---|---|---|---|
2021/12/28(水) | マトリックス【吹替版】(リンクは Yahoo! GYAO! で検索) SFアクション/1999年アメリカ/2時間16分/キアヌ・リーブ ス 面白いんだけど、物語がもう一歩かなと思う。
|
2022/2/22 までGYAOにて無料配信 |
★★★★☆ 4.2 |
★★★☆☆ 3.9 |
2021/11 /27(土) | コード211【吹替版】(リンクは Yahoo! GYAO! で検索) 刑事アクション/2018年アメリカ/1時間27分/ニコラス・ケイ ジ 面白かったのに、どうして公評価が★2.9なんだろ…
こういう言い方は変かもしれませんが、昭和の時代の全盛期のハリウッ
ド映画が好きな方は楽しめるんじゃないかと思いました。
私が一番いいなと思ったのは、同乗者の少年かな。彼がいなかったらあ
りきたりの映画になったかも。 オススメ!
公評価の低評価の具体的な内容は、だいたいは「面白そうな要素(傭兵
やインターポール)が多いのに、ひねりのない展開(正統的)で最後があっけない」でした。
いつも思いますが、公の評価はレベルが高く、少し厳しいのかなと思い
ます。
|
無料配信 現在終了 |
★★☆☆☆ 2.9 |
★★★★☆ 4 |
2021/10 /25(月) | バーニング・オーシャン【吹き替え版】(リンクは Yahoo! GYAO! で検索) ディザスター/2016年アメリカ/1:47:14/マーク・ウォールバーグ(トランスフォーマー)、カート・ラッセル(バックドラフ ト) 「2010年メキシコ湾原油流出事故」(リンクは
Wikipedia)をもとに製作されたディザスタームービー。
技術的不手際により掘削中の海底油田から逆流してきた天然ガスが引火
爆発し、126人の作業員のうち11人が行方不明となり、17人が負傷した。
下記のアンダーウォーターと同じく、描写は完ぺき。なおかつ、面白
かった。
|
2021/11/5 までGYAOにて無料配信 |
★★★★☆ 4 |
★★★☆☆ 3.8 |
日
付 (上ほど新しい) |
タイトル | 公評価 | 私 評価 |
---|---|---|---|
2021/8/7 | 曲:アンインストール(リンクは Apple Music の当該ページへ)
2007年の「ぼくらの」というロボットアニメの主題歌
歌詞を読みましたが、「突然現れた新しい現実に対し、受け入れ、や
るっきゃない」と言っているのかなぁ…
|
★★★★★ 5 |
★★★★☆ 4 |
2021/7/9 | ゲーム:ザ・トリロジーズ -T&E SOFT / XTAL SOFT COLLECTION-(リ
ンクは EGG の当該ページへ)
PCレトロゲームのセット。RPG開発の研究のために予約で購入。発売日は2022年2月だそうです。
|
発売前 | 発売前 |
2021/5/29 | 曲:最強○×計画(リンクは Apple Music の当該ページへ) 2006年の「すもももももも 地上最強のヨメ」というアニメの主題
歌
|
★★★★☆ 4.5 |
★★★★☆ 4 |
47才、男、B型(BB)
電子機器の基板を製造する工場で、派遣で働いています。
プログラミングが好きで小学校5年生のころからずっと続けています。
アニメ見ます、ガンプラ作ります、映画見ます、ゲーム音楽いっぱい聴きます。
ページ上にていろいろ才能(少々 粗削りな才能)を発揮していると思いますが、なるべく自 分だけで終わらないようにといつも思っています。
いろいろ厳しい考え方も持っていますが、厳しすぎないように全体とのバランスも考えていま す。
将来の夢は5つくらい持っていますが、生きてる間に実現できそうにありません。
私が使っているペンネーム(ハンドルネーム)は新しい順に
ペ ンネーム(ハンドルネーム) | いつごろ | 場 所 |
---|---|---|
daikei | 現在(少) | Yahoo Japan |
d_kawakawa | 現在(多) | どこでも |
cookiepuddingman、cookiepudingman | ちょっと前 | |
かわ、kawa | 30年前 | パソコン通信 |
※基本的には d_kawakawa とお呼びください。
※なお、現在このホームページには私 への連絡手段がありません。気が向いたら用意します。
冬の花「パンジー」を近所の花屋で買いました。
花だけではなく、葉もきれいだな。
左の画像リンクをクリックすると 画像を拡大 します。
両端の横長の鉢が今回買ったパンジー。
中央の丸い鉢は以前からある花で、もう5,6年は生き続けているかな?
茎が木の枝のように茶色く固く強く、花なんだけど、木みたいです。
1,2年前に、そばのブロック塀(べい)から、ケンカ中の猫が鉢植えに向かって勢いよく飛び降りたときに、枝の半分が根元から折れてしまい、写真のように盆栽みたいに横方向に 片寄っちゃいました。
左の画像リンクをクリックすると 画像を拡大 します。
アスキー出版テクライト「PC-9801シリーズ テクニカルデータブック HARDWARE編」
(1992年4月初版発行、定価4500円)
「アセンブラやるならその機械の資料はたくさん持っていたほうが良い」
と、どこかのサイトで教えてくれていたので、購入することにしました。
Amazon にて中古本 878 円+送料 350 円 で購入しました。(今月 1/4 に購入)
”
”、”
”…等と言われている本です。
1992 年初版発行ですが、そのころ私は 18 才でした。
左の画像リンクをクリックすると 画像を拡大 します。
PC-9801 の画面は 640×400 というかなりマイナーなサイズです。普通のディスプレイにつなぐと縦長に引き伸ばされてしまいます。
PC-9801 の画面をゆがみなく正しく表示できるディスプレイがほしいと思って、WEB検索したところ、次のようなサイトを見つけました。PC-9801 で使えるディスプレイの探し方を伝授してくれています。
PC98 で使える液晶ディスプレイ(モニター)の条件について
このサイトの管理者ご本人が使っている「EIZO L997」が高機能で良いなと思いました。
サイトを見ると、綺麗な画面ですよね。
Yahoo! オークションで探したら、運よくありました。コレ
即決価格 15,000 円+送料 1,958 円。
低所得でこれからコロナウイルス感染拡大で、もし仕事が休業になってしまうと、派遣なので時給ですから休んだ分給料が減ってしまい、生 活費がキリキリになってしまう恐れがあります。
だから、この出費は大きい…。でも購入することにしたそのわけは?
恥ずかしながら私の私的なメモです↓
という目的をしっかりと持って購入することにしたんです。
オークションでしたが、即決価格で入札したので誰とも競わず落札し、無事に品物が届きました。
左の画像リンクをクリックすると 画像を拡大 します。
届いて、いざ表示してみると、なんだか画面が暗い?
いろいろ調べていたら、どうやら液晶のバックライトが経年劣化で暗くなっているということらしいです。
がっかり!!
”がっかりだよッ!”
左の画像リンクをクリックすると 画像を拡大 します。
でも、目的は PC-9801 でアセンブラを学ぶ、ということで、PC-9801 での画面はどうかなと思って「マルチペイントシステム」でお絵描きして様子を見てみました。
まぁ、楽しんで絵を描けたので、大丈夫かなと思います。
左の画像リンクをクリックすると 画像を拡大 します。
マルチぺイントの起動時のコマンドライン出力(テキスト)
左の画像リンクをクリックすると 画像を拡大 します。
「98ハードに強くなる本II」のサンプルプログラムの1つを実行しました。
「オー出た」と喜んじゃいました。
PC-9801 特有の「グラフィックLIO(Logical Input Output)」という ROM 上のソフトウェアを使って、楕円(扇形)を描いています。
PC-9801 の BASIC 言語である 「N88-BASIC」は内部でこの「グラフィックLIO」を使ってグラフィックを描いているらしいです。
30年前はよく「N88-BASIC」を使って何かを作っていましたが、今こうやってアセンブラから直接「グラフィックLIO」にアクセスして同じ動作をさせてみると、なんともうれしい感じがします。
左の画像リンクをクリックすると 画像を拡大 します。
同じサンプルプログラムをちょっといじって正円にしてみました。
正円が縦方向に引き伸ばされずに、ちゃんと正円で表示されています。
「オーやっぱり燃えてくるな」
EIZO L997 を買った甲斐(かい)がありました。
左の画像リンクをクリックすると 画像を拡大 します。
さらに、円の塗りつぶしにパターン(タイル)が使えるというのでやってみました。
「面白すぎるぞ PC-98。なるほどこれはスゴイ」
左の画像リンクをクリックすると 画像を拡大 します。
ちょっと気が向いて、「N88-BASIC」の MON コマンドでモニタモード(アセンブラ環境)に入り、メモリ上の VRAM 部分(アドレスA800H)に何か値を入れてみました。
すると画面の左上に少し、グラフィックの青いドットが描かれました。
オオっ、と思って、モニタモードの F コマンド(メモリの指定アドレスから指定アドレスまでを指定バイトで埋める)を使って、左図のように手動でグラデーションをかけて遊んでみました。(円は上図の円をそのまま残していたものです)
これが、わりと高速に描画されるので、そりゃぁもう大感動でした。
この感動を、何度も言いますが、高校生の時に知りたかった、、ほんとに。
左の画像リンクをクリックすると 画像を拡大 します。
どうして Windows にはその無限の宇宙を感じなかったのだろうか。
Android でもアプリをちょっと作ったけど、違うと思った。
コンピューターの環境が先進的になればなるほど、
何か落胆していくのはどうしてなんでしょうね。
本当の車好きは、プリウスよりもアルファロメオのほうがずっと楽しいのと同じかな。
このウェブページ上での「プログラムリストの表示機能」のテストです。
プログラムリストを、一部変更したり、行を追加したり、削除したりして、新しいプログラムへと書き換える作業は、プログラマーならだれでも日常 的に行っていると思い ます。
その「書き換え前のプログラムリスト」と「書き換え後のプログラムリスト」を比較して、どの部分が変更されたのかを、マーキングして表示するよ うにしました。
下のプログラムリストの表示では、変更された部分について、追加行、変更行、削除行のようにマーキングしています。削除行についてはその行がな いので、この位置にあったよ、という意味です。
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、正六面体の頂点8つが3DCG計算されて描かれる。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
for( var i = 0; i < tens.length; i++ ) {
var x = tens[ i ].x;
var y = tens[ i ].y;
var z = tens[ i ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//描画
canvas.beginPath();
canvas.arc( screenW / 2 + h, screenH / 2 + v, 4, 0, 6.28, false );
canvas.closePath();
canvas.fillStyle = "orange";
canvas.fill();
}
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、ワイヤーフレームで正六面体が描かれる。
3DCG仕様:
Z軸は奥へ行くほど増加し、手前に来るほど減少する。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
mens = [
[ 3, 2, 1, 0 ], //向かって正面
[ 1, 2, 6, 5 ], //向かって右面
[ 0, 4, 7, 3 ], //向かって左面
[ 7, 6, 2, 3 ], //向かって上面
[ 0, 1, 5, 4 ], //向かって下面
[ 5, 6, 7, 4 ], //向かって背面
]; //※各面の点の並びは時計回り
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
//各面について
for( var i = 0; i < mens.length; i++ ) {
var men = mens[ i ];
//描画
canvas.beginPath();
//面を構成する各頂点について
for( var j = 0; j < men.length; j++ ) {
var tenIDX = men[ j ];
var x = tens[ tenIDX ].x;
var y = tens[ tenIDX ].y;
var z = tens[ tenIDX ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//最初の点はmoveTo、続く点はlineTo
if( j == 0 ) {
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
} else {
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
}
}
canvas.closePath();
//面の線を描く
canvas.strokeStyle = "black";
canvas.stroke();
}
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、ワイヤーフレームで正六面体が描かれる。
(draw()の処理構造を変更。のちの陰面処理などはこの構造が適している)
3DCG仕様:
Z軸は奥へ行くほど増加し、手前に来るほど減少する。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
mens = [
[ 3, 2, 1, 0 ], //向かって正面
[ 1, 2, 6, 5 ], //向かって右面
[ 0, 4, 7, 3 ], //向かって左面
[ 7, 6, 2, 3 ], //向かって上面
[ 0, 1, 5, 4 ], //向かって下面
[ 5, 6, 7, 4 ], //向かって背面
]; //※各面の点の並びは時計回り
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
//頂点の位置を計算
var tensC = new Array();
for( var i = 0; i < tens.length; i++ ) {
var x = tens[ i ].x;
var y = tens[ i ].y;
var z = tens[ i ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//値を保管
tensC[ i ] = new Object();
tensC[ i ].x = x;
tensC[ i ].y = y;
tensC[ i ].z = z;
tensC[ i ].h = h;
tensC[ i ].v = v;
}//for i
//頂点の位置を計算済み
//描画
for( var i = 0; i < mens.length; i++ ) {
var men = mens[ i ];
//面を構成する点を順にたどる
canvas.beginPath();
for( var j = 0; j < men.length; j++ ) {
var tenIDX = men[ j ];
var ten = tensC[ tenIDX ];
var h = ten.h;
var v = ten.v;
//最初の点はmoveTo、続く点はlineTo
if( j == 0 ) {
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
} else {
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
}
}
canvas.closePath();
//面の線を描く
canvas.strokeStyle = "black";
canvas.stroke();
}
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、正六面体の面の前後関係が正しく描かれる。
(「画家のアルゴリズム」で陰面消去される)
3DCG仕様:
Z軸は奥へ行くほど増加し、手前に来るほど減少する。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
mens = [
[ 3, 2, 1, 0 ], //向かって正面
[ 1, 2, 6, 5 ], //向かって右面
[ 0, 4, 7, 3 ], //向かって左面
[ 7, 6, 2, 3 ], //向かって上面
[ 0, 1, 5, 4 ], //向かって下面
[ 5, 6, 7, 4 ], //向かって背面
]; //※各面の点の並びは時計回り
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
//頂点の位置を計算
var tensC = new Array();
for( var i = 0; i < tens.length; i++ ) {
var x = tens[ i ].x;
var y = tens[ i ].y;
var z = tens[ i ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//値を保管
tensC[ i ] = new Object();
tensC[ i ].x = x;
tensC[ i ].y = y;
tensC[ i ].z = z;
tensC[ i ].h = h;
tensC[ i ].v = v;
}//for i
//頂点の位置を計算済み
//面の配列を作成する
var allmens = new Array();
for( var j = 0; j < mens.length; j++ ) {
var men = mens[ j ];
//面を構成する点を順にたどる
var sumZ = 0;
for( var k = 0; k < men.length; k++ ) {
var tenIDX = men[ k ];
var ten = tensC[ tenIDX ];
sumZ += ten.z;
}
//allmensへ追加する
var theMen = new Object();
theMen.men = men;
theMen.avgZ = sumZ / men.length;
allmens.push( theMen );
}//for j
//すべての面を奥から手前の順にソート
//(陰面消去1 「画家のアルゴリズム」)
allmens.sort( function( a, b ) {
if( a.avgZ > b.avgZ ) return -1;
else if( a.avgZ < b.avgZ ) return 1;
else return 0;
} );
//描画
for( var i = 0; i < allmens.length; i++ ) {
var men = allmens[ i ].men;
//面を構成する点を順にたどる
canvas.beginPath();
for( var j = 0; j < men.length; j++ ) {
var tenIDX = men[ j ];
var ten = tensC[ tenIDX ];
var h = ten.h;
var v = ten.v;
//最初の点はmoveTo、続く点はlineTo
if( j == 0 ) {
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
} else {
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
}
}
canvas.closePath();
//面の中を塗る
canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";
canvas.fill();
//面の線を描く
canvas.strokeStyle = "black";
canvas.stroke();
}
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、こちら(視点の方向)を向いていない面は描画が省略されて、
正六面体が描かれる。
(「法線ベクトル法」で陰面消去される)
3DCG仕様:
Z軸は奥へ行くほど増加し、手前に来るほど減少する。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
mens = [
[ 3, 2, 1, 0 ], //向かって正面
[ 1, 2, 6, 5 ], //向かって右面
[ 0, 4, 7, 3 ], //向かって左面
[ 7, 6, 2, 3 ], //向かって上面
[ 0, 1, 5, 4 ], //向かって下面
[ 5, 6, 7, 4 ], //向かって背面
]; //※各面の点の並びは時計回り
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
//頂点の位置を計算
var tensC = new Array();
for( var i = 0; i < tens.length; i++ ) {
var x = tens[ i ].x;
var y = tens[ i ].y;
var z = tens[ i ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//値を保管
tensC[ i ] = new Object();
tensC[ i ].x = x;
tensC[ i ].y = y;
tensC[ i ].z = z;
tensC[ i ].h = h;
tensC[ i ].v = v;
}//for i
//頂点の位置を計算済み
//面の配列を作成する
var allmens = new Array();
for( var j = 0; j < mens.length; j++ ) {
var men = mens[ j ];
//check. 面が視点のほうを向いていないなら、その面は除去
var tmpTens = new Array();
for( var i = 0; i < men.length; i++ )
tmpTens.push( tensC[ men[ i ] ] );
if( ! checkVisibility( tmpTens ) ) continue;
//面を構成する点を順にたどる
var sumZ = 0;
for( var k = 0; k < men.length; k++ ) {
var tenIDX = men[ k ];
var ten = tensC[ tenIDX ];
sumZ += ten.z;
}
//allmensへ追加する
var theMen = new Object();
theMen.men = men;
theMen.avgZ = sumZ / men.length;
allmens.push( theMen );
}//for j
//すべての面を奥から手前の順にソート
//(陰面消去1 「画家のアルゴリズム」)
allmens.sort( function( a, b ) {
if( a.avgZ > b.avgZ ) return -1;
else if( a.avgZ < b.avgZ ) return 1;
else return 0;
} );
//描画
for( var i = 0; i < allmens.length; i++ ) {
var men = allmens[ i ].men;
//面を構成する点を順にたどる
canvas.beginPath();
for( var j = 0; j < men.length; j++ ) {
var tenIDX = men[ j ];
var ten = tensC[ tenIDX ];
var h = ten.h;
var v = ten.v;
//最初の点はmoveTo、続く点はlineTo
if( j == 0 ) {
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
} else {
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
}
}
canvas.closePath();
//面の中を塗る
canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";
canvas.fill();
//面の線を描く
canvas.strokeStyle = "black";
canvas.stroke();
}
}
//---その他関数
function checkVisibility( p ) {
var x1 = p[ 0 ].x, y1 = p[ 0 ].y, z1 = p[ 0 ].z;
var x2 = p[ 1 ].x, y2 = p[ 1 ].y, z2 = p[ 1 ].z;
var x3 = p[ 2 ].x, y3 = p[ 2 ].y, z3 = p[ 2 ].z;
//法線(housen)
var hx = (y2-y1)*(z3-z2)-(z2-z1)*(y3-y2);
var hy = (z2-z1)*(x3-x2)-(x2-x1)*(z3-z2);
var hz = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2);
//視点の方向(eye)
var ex = 0, ey = 0, ez = 0;
//重心(各成分の平均値)を計算している
for( var i = 0; i < p.length; i++ ) {
ex += p[ i ].x;
ey += p[ i ].y;
ez += p[ i ].z;
}
ex /= -p.length;
ey /= -p.length;
ez /= -p.length;
//法線と視点方向の内積(※cosθ)
var a = ex * hx + ey * hy + ez * hz;
return a > 0;
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>untitled canvas</title>
<script>
console.log( "=============== script ==============" );
/*
『原理を使用した3DCG - 基本プログラム』
実行すると、正六面体が回転されて描かれる。
3DCG仕様:
Z軸は奥へ行くほど増加し、手前に来るほど減少する。
*/
function $( id ) { return document.getElementById( id ); }
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
var canvasEL, canvas;
function onloadx() {
canvasEL = $( "canvasELID" );
canvas = canvasEL.getContext( '2d' );
screenW = canvasEL.width;
screenH = canvasEL.height;
//(canvasSpecial resize / crisp low)
//正六面体の頂点(中心を原点としたときの位置)
tens = [
{ x : -1, y : -1, z : -1 }, //0: 左下 手前
{ x : +1, y : -1, z : -1 }, //1: 右下 手前
{ x : +1, y : +1, z : -1 }, //2: 右上 手前
{ x : -1, y : +1, z : -1 }, //3: 左上 手前
{ x : -1, y : -1, z : +1 }, //4: 左下 奥
{ x : +1, y : -1, z : +1 }, //5: 右下 奥
{ x : +1, y : +1, z : +1 }, //6: 右上 奥
{ x : -1, y : +1, z : +1 }, //7: 左上 奥
];
mens = [
[ 3, 2, 1, 0 ], //向かって正面
[ 1, 2, 6, 5 ], //向かって右面
[ 0, 4, 7, 3 ], //向かって左面
[ 7, 6, 2, 3 ], //向かって上面
[ 0, 1, 5, 4 ], //向かって下面
[ 5, 6, 7, 4 ], //向かって背面
]; //※各面の点の並びは時計回り
//正六面体の拡大
scale = 10;
//正六面体の位置
posX = 0;
posY = 0;
posZ = 80;
//正六面体の回転
kaitenH = 3.14 / 4;
kaitenV = 3.14 / 8;
//望遠レンズなら200、普通のカメラなら50(レンズサイズまたは焦点距離という)
s = 50;
draw();
}
function draw() {
//頂点の位置を計算
var tensC = new Array();
for( var i = 0; i < tens.length; i++ ) {
var x = tens[ i ].x;
var y = tens[ i ].y;
var z = tens[ i ].z;
//scale倍
x *= scale;
y *= scale;
z *= scale;
//回転
var res = kaiten( x, z, kaitenH );
x = res.X;
z = res.Y;
var res = kaiten( z, y, kaitenV );
z = res.X;
y = res.Y;
//位置へ移動
x += posX;
y += posY;
z += posZ;
//3Dの座標を2Dの座標に変換する
var h = x * ( s / z );
var v = -y * ( s / z );
//画面を引き延ばし
h *= 14.25;
v *= 14.25;
//値を保管
tensC[ i ] = new Object();
tensC[ i ].x = x;
tensC[ i ].y = y;
tensC[ i ].z = z;
tensC[ i ].h = h;
tensC[ i ].v = v;
}//for i
//頂点の位置を計算済み
//面の配列を作成する
var allmens = new Array();
for( var j = 0; j < mens.length; j++ ) {
var men = mens[ j ];
//check. 面が視点のほうを向いていないなら、その面は除去
var tmpTens = new Array();
for( var i = 0; i < men.length; i++ )
tmpTens.push( tensC[ men[ i ] ] );
if( ! checkVisibility( tmpTens ) ) continue;
//面を構成する点を順にたどる
var sumZ = 0;
for( var k = 0; k < men.length; k++ ) {
var tenIDX = men[ k ];
var ten = tensC[ tenIDX ];
sumZ += ten.z;
}
//allmensへ追加する
var theMen = new Object();
theMen.men = men;
theMen.avgZ = sumZ / men.length;
allmens.push( theMen );
}//for j
//すべての面を奥から手前の順にソート
//(陰面消去1 「画家のアルゴリズム」)
allmens.sort( function( a, b ) {
if( a.avgZ > b.avgZ ) return -1;
else if( a.avgZ < b.avgZ ) return 1;
else return 0;
} );
//描画
for( var i = 0; i < allmens.length; i++ ) {
var men = allmens[ i ].men;
//面を構成する点を順にたどる
canvas.beginPath();
for( var j = 0; j < men.length; j++ ) {
var tenIDX = men[ j ];
var ten = tensC[ tenIDX ];
var h = ten.h;
var v = ten.v;
//最初の点はmoveTo、続く点はlineTo
if( j == 0 ) {
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
} else {
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
}
}
canvas.closePath();
//面の中を塗る
canvas.fillStyle = "RGBA(196, 196, 0, 0.75)";
canvas.fill();
//面の線を描く
canvas.strokeStyle = "black";
canvas.stroke();
}
}
//---その他関数
function checkVisibility( p ) {
var x1 = p[ 0 ].x, y1 = p[ 0 ].y, z1 = p[ 0 ].z;
var x2 = p[ 1 ].x, y2 = p[ 1 ].y, z2 = p[ 1 ].z;
var x3 = p[ 2 ].x, y3 = p[ 2 ].y, z3 = p[ 2 ].z;
//法線(housen)
var hx = (y2-y1)*(z3-z2)-(z2-z1)*(y3-y2);
var hy = (z2-z1)*(x3-x2)-(x2-x1)*(z3-z2);
var hz = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2);
//視点の方向(eye)
var ex = 0, ey = 0, ez = 0;
//重心(各成分の平均値)を計算している
for( var i = 0; i < p.length; i++ ) {
ex += p[ i ].x;
ey += p[ i ].y;
ez += p[ i ].z;
}
ex /= -p.length;
ey /= -p.length;
ez /= -p.length;
//法線と視点方向の内積(※cosθ)
var a = ex * hx + ey * hy + ez * hz;
return a > 0;
}
function kaiten( x, y, theta2 ) {
/*
数学分野の汎用関数
原点を中心にして、回転する
*/
var theta1 = Math.atan2( y, x );
var hankei = Math.sqrt( x * x + y * y );
var kaitenX = Math.cos( theta1 + theta2 ) * hankei;
var kaitenY = Math.sin( theta1 + theta2 ) * hankei;
return { X : kaitenX, Y : kaitenY };
}
</script>
<style>
</style>
</head>
<body onload="onloadx();" style="
background-color : lightgray;
height : 100%;
margin : 0;
">
<canvas id="canvasELID" width="512" height="448" style="
display : block;
margin : auto;
background-color : white;
border : solid 1px black;
">There is no canvas.</canvas>
</body>
</html>
ファイルの比較を行うための「diff」 コマンド(リンクは Wikipedia 当該ページへ)の出力結果をもとにしています。
diff コマンドは UNIX のコマンドの1つです。(正確には、ここで使ったのは、Unix 風のオペレーティングシステム FreeBSD の diff コマンドです)
みなさんがこの Web ページをブラウザから呼び出すと次のような流れでこの diff コマンドが実行されます。
ブラウザ | > | インターネット 上のWEBサーバー | > | サーバー上の perl スクリプト | > | 「プログラムリ ストの表示機能」の別スクリプトファイル |
最後の「プログラムリストの表示機能」の別スクリプトファイル、の途中で以下のような文を実行しています。
my $diffcmd =
$nettype eq 'local' ?
"D:\\ProgramByInstaller\\FPC\\bin\\i386-win32\\diff.exe"
: "diff";
$diffres = join( '', readpipe(
$diffcmd." -b \"$file2FSYS\" \"$pathFSYS\"" ) );
この 1 行目は、”ネットがローカル(私の PC 上の開発用のウェブサーバー)であれば、私のパソコン上の diff.exe を使い、そうでなければ(インターネット上なら)サーバーの diff コマンドを使う”、という内容です。なお、$nettype という変数は事前に私が自前で設定したものです。
2行目は、子プロセスでコマンドを実行しますが、出力結果がほしいので、perl の readpipe という命令を使って、出力結果の各行を得て、1 つの文字列にまとめています。
diff コマンドが使えるかどうか確認する - 「ホームページ領域サービス」に tera-term でアクセス
自分が契約している「ホームページ領域サービス」で diff コマンドが使えるのかどうかは、CGI スクリプトファイルでそのコマンドを実行するようにすればわかりますが、それだと勝手が悪いです。
MS-DOS みたいに コマンドプロンプトからいろいろ作業する方法がありますので、その方法をちょっと紹介 します。
「ホームページ領域サービス」で FTP サーバーの ID や パスワードを発行してもらっているなら、次の方法でコマンドプロンプトを表示できると思います。
必要なもの:
FTP サーバーのアド レス | … | たと えば、web6047.sakura.ne.jp のような文字列です。 |
FTP サーバーの ID | … | たと えば、web6047 のような文字列です。 |
その パス ワード | … | これ
は「ホームページ領域サービス」で発行された複雑な文字列です。 (場合によっては自分で変更しているかもしれません) |
サー ビス | … | SSH |
TCP ポート | … | 22 |
SSH バージョン | … | SSH2 |
プロトコル | … | UNSPEC |
珍しく初日の出を見に行きました。
日の出は 6 時 48 分の予定でしたが、写真のとおり、雲がかかっていたので、7 時丁度くらいに見えました。
「なるほど、これか!」と思って初日の出の価値がコレなんだと知りました。
「きれいだなぁ」と思いました。
でも、”初日の出だからキレイなのか?” といつもの調子で思っちゃいました。
初日の出といっても、毎日の日の出と物理的に何が違うかというと、特に違いはないはずです…。
毎日この時間に散歩で浜辺を歩いている人にとっては、この写真の日の出は「いつもの日の出」に見えるはずで、きれいはきれいなんだけど、いつも と同じ、に見えるんじゃないかな。
いつもの話ですが、年代物の高級なワインよりも、その辺のスーパーで売っている 400 円くらいのワインのほうがよっぽどおいしい、という話を昔、テレビの何かの特集で聞いたことがあります。ペラペラの紙に金額を書いて「おさつ」として価値を設定したからこ そ、みんな「ほしい!!」と言うのであって、物理的には単なるペラペラの紙です。遊戯王のトレーディングカードや、WCCF のサッカー選手のカード、ポケモンのチップ。人間が価値を定めて、たかがカードやプラスチックのチップに 10 万円以上の価値を設定することがあります。ポケモンのカード対戦の全国大会で優勝した者だけに与えられるポケモンモンスターのチップは 13 万円とかの値が付いていました。
でも大事なんですよね。大切な思い入れのあるものなので、ちゃんとわかってあげなきゃいけないんです。
小学生が遊戯王のカードを買い取りの私のレジ(昔の私の仕事)に来たときは、そう思いました。
たとえ価値のないカードであっても、「とてもきれいにしてある良いカードだと思うんだけど、買取価格は…こうなっちゃうよ?」
価値のないカードの買取価格は 10 円だったか…30 枚持って来ても 300 円。いや、1枚 5 円で 150 円とかだったような。
テレビ番組のお宝探偵団の鑑定士の人が最後に、「でも、とても美しい綺麗なカケジクだと思います。大切になさってください」と言いますよね。 きっと同じ気持ちなんだと思います。グローバルな(人々全体としての)見方では価値がなくても、ローカルな(個人や少人数グループとしての)見方 では確かに価値があるんです。
人間がそれに対して思う価値は確かにそこにある。
人が初日の出に対して思う価値は確かにそこにある。
ちなみに、上の写真は浜辺から 25m 上のほうの場所でして、下のほうの浜辺の様子は下の写真です。
上も下も人でいっぱいでした。
家に帰ると(写真の場所から5分)、氷点下だったせいで、手が凍傷になるんじゃないかと思うくらい痛くなってしまい、しばらくヒーターの前から 動けませんでした。
謹賀新年
あけましておめでとうございます。今年もよろしくお願いいたします。
年賀状は仕事が忙しいとか、趣味が忙しいとかで、最近は書けなくなってしまいました。
あらかじめ何か絵が印刷してある年賀状を買って、ちょっとメッセージを書いて送ればそれで良いはずなんですけど、私はそうではなくて、白い何も 印刷されていない年賀状にしっかりと私の絵を描いて送らないと気が済まない、、みたいなところがあるんです。だから時間が無いなら書けないな、送 れないなということになってしまいます。
(訪問者のどんなニーズと この記事がつながるか)